package org.example.scoresystem_backen.service;

import org.example.scoresystem_backen.entity.Class;
import org.example.scoresystem_backen.dto.PageRequest;
import org.example.scoresystem_backen.dto.PageResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * 班级服务接口
 */
public interface ClassService {
    
    /**
     * 创建班级
     * @param clazz 班级信息
     * @return 创建的班级
     */
    Class createClass(Class clazz);
    
    /**
     * 更新班级信息
     * @param clazz 班级信息
     * @return 更新后的班级
     */
    Class updateClass(Class clazz);
    
    /**
     * 删除班级
     * @param id 班级ID
     */
    void deleteClass(Integer id);
    
    /**
     * 根据ID查找班级
     * @param id 班级ID
     * @return 班级信息
     */
    Class findById(Integer id);
    
    /**
     * 获取所有班级
     * @return 班级列表
     */
    List<Class> findAll();
    
    /**
     * 分页查询班级
     * @param pageable 分页参数
     * @return 班级分页数据
     */
    Page<Class> findAll(Pageable pageable);
    
    /**
     * 根据班级名称和年级查找班级
     * @param name 班级名称
     * @param grade 年级
     * @return 班级信息
     */
    Class findByNameAndGrade(String name, String grade);
    
    /**
     * 根据年级查找班级列表
     * @param grade 年级
     * @return 班级列表
     */
    List<Class> findByGrade(String grade);
    
    /**
     * 根据班级名称查找班级列表
     * @param name 班级名称
     * @return 班级列表
     */
    List<Class> findByName(String name);
    
    /**
     * 检查班级名称和年级组合是否存在
     * @param name 班级名称
     * @param grade 年级
     * @return 是否存在
     */
    boolean existsByNameAndGrade(String name, String grade);
    
    /**
     * 根据年级模糊查询班级
     * @param grade 年级关键字
     * @return 班级列表
     */
    List<Class> findByGradeContaining(String grade);
    
    /**
     * 根据班级名称模糊查询班级
     * @param name 班级名称关键字
     * @return 班级列表
     */
    List<Class> findByNameContaining(String name);
    
    /**
     * 获取所有年级列表（去重）
     * @return 年级列表
     */
    List<String> findAllGrades();

    /**
     * 分页查询班级（支持搜索和筛选）
     * @param pageRequest 分页请求参数
     * @param grade 年级筛选（可选）
     * @return 分页响应结果
     */
    PageResponse<Class> findClassesWithPagination(PageRequest pageRequest, String grade);

    /**
     * 级联删除班级（删除班级及其相关的学生和成绩记录）
     * @param id 班级ID
     * @return 删除结果统计
     */
    Map<String, Object> deleteClassWithCascade(Integer id);
}
